---
title: Cloudflare Workers
description: Example of self-hosting c15t and Cloudflare Workers.
lastModified: 2025-08-16
---

<Callout type="info">
  To view the full example, see the [Cloudflare example
  repository](https://github.com/c15t/examples/tree/main/cloudflare-worker).
</Callout>

```tsx title="src/index.ts"
import { c15tInstance } from "@c15t/backend/v2";
import { kyselyAdapter } from "@c15t/backend/v2/db/adapters/kysely";
import { Kysely, PostgresDialect } from "kysely";
import { Pool } from "pg";

const handler = (env: Env) => {
  const instance = c15tInstance({
    appName: "c15t-self-host",
    basePath: "/api/c15t",
    adapter: kyselyAdapter({
      db: new Kysely({
        dialect: new PostgresDialect({
          pool: new Pool({
            connectionString: env.DATABASE_URL
          })
        })
      }),
      provider: "postgresql"
    }),

    trustedOrigins: ["localhost", "vercel.app"],
    advanced: {
      disableGeoLocation: true,
      openapi: {
        enabled: true
      }
    },
    logger: {
      level: "error"
    }
  });

  return async (request: Request): Promise<Response> => {
    try {
      return await instance.handler(request);
    } catch (error) {
      console.error("Error handling request:", error);

      return new Response(
        JSON.stringify({
          error: "Internal Server Error",
          message: error instanceof Error ? error.message : String(error)
        }),
        {
          status: 500,
          headers: { "Content-Type": "application/json" }
        }
      );
    }
  };
};

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    return await handler(env)(request);
  }
};
```
